﻿using System;

namespace Lesson14_继承_继承中的构造函数
{
    #region 一 基本概念
    //特点
    //申明一个子类对象时
    //先执行父类构造函数
    //再执行子类构造函数

    //注意
    //1.父类的无参构造
    //2.子类可以通过base关键字 调用父类构造
    #endregion

    #region 二 继承中构造函数的执行顺序
    //按父类级别从上级到下级 依次执行
    class GameObject
    {
        public GameObject()
        {
            Console.WriteLine("构造一");
        }
    }
    class Player : GameObject
    {
        public Player()
        {
            Console.WriteLine("构造二");
        }
    }
    class MainPlayer : Player
    {
        public MainPlayer()
        {
            Console.WriteLine("构造三");
        }
    }
    #endregion

    #region 三 子类默认调用父类无参构造函数
    //子类实例化时 默认自动调用的 是父类的无参构造 所以如果父类无参构造不存在 则会报错(若主动调用父类有参构造函数，不会报错)
    class Father
    {
        //若重载有参的构造函数 那么无参的构造函数会消失 子类无法调用

        public Father(int i)
        {
            Console.WriteLine("Father构造函数");
        }
    }
    class Son : Father
    {
        #region 四 通过base关键字调用指定父类构造
        public Son(int i) : base(i)
        {
            //base直接调用指定父类构造
        }
        #endregion
    }
    #endregion


    class Program
    {
        static void Main(string[] args)
        {
            #region 二 继承中构造函数的执行顺序
            MainPlayer mp1 = new MainPlayer();
            //控制台输出结果：
            // 构造一
            // 构造二
            // 构造三
            #endregion
        }
    }
}